home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 7
/
FM Towns Free Software Collection 7.iso
/
data
/
happypas
/
reversi.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-11-30
|
7KB
|
168 lines
{*********************************************************************
* *** 人間対戦の リバーシ *** *
* *
* HAPPyのサンプルプログラム *
* (作者 浅野比富美 Public Domain Software) *
*********************************************************************}
program Reversi(input,output) ;
{ 白、黒ともに人間が座標を入力することでリバーシゲームを進めていきます }
const N = 8 ; { 盤の1辺のマス目 }
M = 9 ; { N+1 実際の配列は上下左右に1つずつ余分がある }
type TableStatus = (disable, enable, white, black) ; { 盤の状態 }
TableRange = 0 .. M ;
var Table : array[TableRange,TableRange] of TableStatus ;
Icolor,Ycolor : TableStatus ; { 私(I)、あなた(You)の色 }
Wno,Bno : integer ; { 白、黒の石数 }
pass,Wpass,Bpass : Boolean ; { パスの時 真 }
direction : array[1..8] of record
xd,yd : integer { x,y方向差分 }
end ;
{*********************
初期設定処理
*********************}
procedure Init ;
var x,y : TableRange ;
begin
for x:=0 to M do
for y:=0 to M do Table[x,y] := disable ;
Table[N div 2 ,N div 2]:=white; Table[N div 2 ,N div 2+1]:=black; {○●}
Table[N div 2+1,N div 2]:=black; Table[N div 2+1,N div 2+1]:=white; {●○}
Wno := 2 ; Bno := 2 ;
Wpass := false ; Bpass := false ;
with direction[1] do begin xd := 0; yd := -1 end ; { 左 }
with direction[2] do begin xd := 0; yd := 1 end ; { 右 }
with direction[3] do begin xd := 1; yd := -1 end ; { 左下 }
with direction[4] do begin xd := 1; yd := 0 end ; { 下 }
with direction[5] do begin xd := 1; yd := 1 end ; { 右下 }
with direction[6] do begin xd := -1; yd := -1 end ; { 左上 }
with direction[7] do begin xd := -1; yd := 0 end ; { 上 }
with direction[8] do begin xd := -1; yd := 1 end { 右上 }
end { Init };
{*****************************************
石を置けるかの判定と石の反転処理
*****************************************}
procedure CheckReverse(rev : Boolean ; point: integer) ;
label 9 ; { CheckReverse処理の終わりのラベル }
var x,y,xx,yy : TableRange ;
i : 1..8 ;
begin
if (point < 0) or (sqr(N) <= point) then goto 9 ; { マス目範囲外 }
x := point div N + 1 ; y := point mod N + 1 ; { 対応するx,y座標 }
if Table[x,y] > enable then goto 9 ; { 既に石あり }
Table[x,y] := disable ;
for i:=1 to 8 do { 8方向について調べる }
with direction[i] do
begin
xx := x + xd ; yy := y + yd ;
if Table[xx,yy] = Ycolor then { 隣が相手の色 }
begin
while Table[xx,yy] = Ycolor do
begin xx := xx + xd ; yy := yy + yd end ;
if Table[xx,yy] = Icolor then { 自分の色で囲める }
begin
Table[x,y] := enable ;
pass := false ; { パスとならない }
if rev then { 反転モード }
repeat { 自分の色に反転する }
xx := xx - xd; yy := yy - yd; Table[xx,yy] := Icolor
until (xx = x) and (yy = y)
else goto 9 { チェック時は他方向を調べる必要なし}
end
end
end ;
9:end { CheckReverse } ;
{**********************
盤の印字処理
**********************}
procedure Print ;
type line = packed array[1..4] of char ;
var x,y : TableRange ;
{***** 横線の印字処理 *****}
procedure Hline(left,mid,right : line) ;
var y : TableRange ;
begin
write(left);
for y:=1 to N-1 do write(mid) ;
writeln(right)
end { Hline } ;
begin { Print }
Hline(' ┏','━┳','━┓') ; { 一番上の横線 }
for x:=1 to N do
begin
write(' ┃') ;
for y:=1 to N do
begin
case Table[x,y] of
enable : write((x-1)*N+y-1:2) ; { 石が置ける場所には盤座標 }
disable : write(' ') ; { 石が置けない場所は空白 }
white : write('○') ; { 白 }
black : write('●') { 黒 }
end ;
write('┃')
end ;
writeln ;
if x <> N then Hline(' ┣','━╋','━┫') { 中間の横線 }
else Hline(' ┗','━┻','━┛') { 一番下の横線 }
end ;
writeln(' ':10,' ○の数=',Wno:2) ;
writeln(' ':10,' ●の数=',Bno:2)
end { Print } ;
{********************************
石を置く場所の入力処理
********************************}
procedure InputPoint ;
var point : integer ;
x,y : TableRange ;
begin
writeln ; writeln ;
if Icolor = white then write('○') else write('●') ;
writeln('の番だよ ') ;
pass := true ;
for point:=0 to sqr(N)-1 do CheckReverse(false{反転なし},point) ;
if Icolor = white then Wpass := pass else Bpass := pass ;
if pass then writeln(' *** 石が置けないのでパス!')
else begin { 石が置ける場合 }
Print ; { 盤の状態を印字 }
pass := true ;
repeat
write('? ') ; readln(point) ;
CheckReverse(true{反転あり},point) { 置ける場合は反転もする }
until not pass ; { 置けなければ再入力 }
Bno := 0 ; Wno := 0 ; { 反転後の石の数を数える }
for x:=1 to N do
for y:=1 to N do
case Table[x,y] of
white : Wno := Wno + 1 ;
black : Bno := Bno + 1 ;
disable,enable : ;
end
end
end { InputPoint };
{********************
メイン処理
********************}
begin { main }
Init ;
repeat
Icolor := white ; Ycolor := black ; InputPoint ; { 白の入力 }
if Bno+Wno <> sqr(N) then
begin Icolor := black; Ycolor := white; InputPoint end { 黒の入力 }
until (Bno+Wno = sqr(N)) or (Wpass and Bpass) ;
Print ; { 最終結果を表示 }
if Wno > Bno then writeln('○の勝ち!')
else if Wno < Bno then writeln('●の勝ち!')
else writeln('引分けだね!')
end.